/**
 * 类型别名：
 *
 *    是通过一个关键字 type 来定义一个新的类型，方便后续的使用或复用
 *
 *    语法：
 *
 *      type xxx = 类型
 */

/**
 * 1. 给现有类型取个别名
 */
type mystring = string;

// 2. 给联合类型取个别名
type id = number | string;

// 3. 给对象类型取个别名
type Person = {
  name: string;
  readonly age: number;
  sex?: string;
};

// 4. 给函数类型取个别名
type myFunction = (arg1: string, arg2: number) => number;

const f2: myFunction = function (name: string, age: number) {
  return 100;
};

// 5. 通过类型工具得到的新类型，也要使用 type 来定义
//    1. 假如需要将 Person 的所有属性都变成 readonly
type Person1 = Readonly<Person>;
//    2. 假如需要将 Perons 的所有属性都变成 可选
type Person2 = Partial<Person>;
//    3. 假如需要从 一个对象类型中选取一个或多个属性来组成一个新的对象类型
type Person3 = Pick<Person, "name">;
type Person4 = Pick<Person, "name" | "age">;
//    3. 假如需要从 一个对象类型中剔除一个或多个属性来组成一个新的对象类型
type Person5 = Omit<Person, "name">;
type Person6 = Omit<Person, "name" | "age">;
//    4. 如果要生成一个对象类型，且对象类型的 value 值都为同类型，则可以 Record
type Person7 = Record<"name" | "age", string>;
const ooo: Person7 = {
  name: "",
  age: "",
};
